module Instrument.CCD where

import GSL.Random.Gen  ( RNG )
import GSL.Random.Dist ( getPoisson, getGaussian )

-- Среднее значение темнового тока за секунду

type DBG= Double

-- Значение шума считывания

type RN = Double

--

data CCD = CCD { thickness :: Double, -- толщина чувствительного слоя в пикселях
                 width     :: Int,    -- ширина матрицы в пикселях
                 height    :: Int,    -- высота матрицы в пикселях
                 psize     :: (Double,Double), -- размер пикселя в сантиметрах
                 bias      :: Double, -- Начальный уровень
                 dnoise    :: DBG,    -- темновой (тепловой) шум в электронах за секунду
                 rnoise    :: RN      -- шум считывания в электронах на пиксель
               } deriving (Show)

-- 

genDarkNoise :: Num a => RNG -> DBG -> IO a
genDarkNoise r bg = do
    n <- getPoisson r bg
    return $ fromIntegral n

genReadNoise :: Num a => RNG -> RN -> IO a
genReadNoise r s = do
    n <- getGaussian r s
    return $ fromIntegral $ round n